फ्लेक्सबॉक्स की बुनियादी बातों से आगे बढ़ें। align-content, flex-grow, flex-shrink, और व्यावहारिक, वास्तविक दुनिया के लेआउट परिदृश्यों के साथ उन्नत अलाइनमेंट और डिस्ट्रीब्यूशन में महारत हासिल करें।
CSS फ्लेक्सबॉक्स मास्टरी: उन्नत अलाइनमेंट और डिस्ट्रीब्यूशन
कई वर्षों से, CSS फ्लेक्सबॉक्स आधुनिक वेब लेआउट का एक आधारशिला रहा है। अधिकांश डेवलपर आइटम्स को एक पंक्ति में संरेखित करने या सरल सेंटर्ड कॉम्पोनेंट्स बनाने के लिए display: flex का उपयोग करने में सहज हैं। हालांकि, फ्लेक्सबॉक्स की सच्ची महारत उन्नत अलाइनमेंट और डायनेमिक डिस्ट्रीब्यूशन के लिए इसकी अधिक बारीक प्रॉपर्टीज को समझने में निहित है। जब आप justify-content: center और align-items: center की बुनियादी बातों से आगे बढ़ते हैं, तो आप आश्चर्यजनक आसानी से जटिल, रिस्पॉन्सिव और स्वाभाविक रूप से लचीले लेआउट बनाने की शक्ति को अनलॉक करते हैं।
यह गाइड उन डेवलपर्स के लिए है जो बुनियादी बातों को जानते हैं लेकिन अपनी समझ को गहरा करना चाहते हैं। हम उन प्रॉपर्टीज का पता लगाएंगे जो मल्टी-लाइन अलाइनमेंट को नियंत्रित करती हैं, फ्लेक्स आइटम के बढ़ने और सिकुड़ने के पीछे का परिष्कृत तर्क, और कई शक्तिशाली पैटर्न जो सामान्य लेआउट चुनौतियों को हल करते हैं। एक आकस्मिक उपयोगकर्ता से एक आत्मविश्वास से भरे फ्लेक्सबॉक्स आर्किटेक्ट बनने के लिए तैयार रहें।
आधार: मुख्य और क्रॉस अक्षों पर एक त्वरित पुनश्चर्या
उन्नत विषयों में जाने से पहले, उन दो अक्षों की ठोस समझ होना महत्वपूर्ण है जो प्रत्येक फ्लेक्स कंटेनर को नियंत्रित करते हैं। फ्लेक्सबॉक्स में सभी अलाइनमेंट और डिस्ट्रीब्यूशन प्रॉपर्टीज इनमें से किसी एक अक्ष पर काम करती हैं।
- मुख्य अक्ष: यह प्राथमिक अक्ष है जिसके साथ फ्लेक्स आइटम लगाए जाते हैं। इसकी दिशा
flex-directionप्रॉपर्टी द्वारा परिभाषित की जाती है। - क्रॉस अक्ष: यह अक्ष हमेशा मुख्य अक्ष के लंबवत होता है।
मुख्य बात यह है कि ये अक्ष स्थिर नहीं हैं। वे आपके flex-direction मान के आधार पर खुद को पुन: व्यवस्थित करते हैं:
flex-direction: row(डिफ़ॉल्ट): मुख्य अक्ष क्षैतिज (बाएं से दाएं) है, और क्रॉस अक्ष ऊर्ध्वाधर (ऊपर से नीचे) है।flex-direction: column: मुख्य अक्ष ऊर्ध्वाधर (ऊपर से नीचे) हो जाता है, और क्रॉस अक्ष क्षैतिज (बाएं से दाएं) हो जाता है।flex-direction: row-reverse: मुख्य अक्ष क्षैतिज है लेकिन दाएं से बाएं चलता है।flex-direction: column-reverse: मुख्य अक्ष ऊर्ध्वाधर है लेकिन नीचे से ऊपर चलता है।
इस मौलिक अवधारणा को भूल जाना ही अधिकांश फ्लेक्सबॉक्स भ्रम का स्रोत है। हमेशा खुद से पूछें: "मेरा मुख्य अक्ष किस दिशा में इंगित कर रहा है?" अलाइनमेंट प्रॉपर्टी लागू करने से पहले।
justify-content के साथ मुख्य अक्ष डिस्ट्रीब्यूशन में महारत हासिल करना
justify-content प्रॉपर्टी नियंत्रित करती है कि मुख्य अक्ष के साथ फ्लेक्स आइटम के बीच और आसपास की जगह को कैसे वितरित किया जाता है। जबकि flex-start, flex-end और center सीधे हैं, वास्तविक शक्ति स्पेस-डिस्ट्रीब्यूशन मानों में निहित है।
स्पेस डिस्ट्रीब्यूशन पर एक गहरी नज़र
आइए space-between, space-around और space-evenly के बीच के सूक्ष्म लेकिन महत्वपूर्ण अंतरों को स्पष्ट करें।
-
justify-content: space-between;यह मान मुख्य अक्ष पर आइटम को समान रूप से वितरित करता है। पहला आइटम कंटेनर की शुरुआत में और अंतिम आइटम कंटेनर के अंत में धकेल दिया जाता है। शेष सभी स्थान आइटम के बीच समान रूप से विभाजित हैं। बाहरी किनारों पर कोई जगह नहीं है।
उपयोग का मामला: नेविगेशन बार के लिए बिल्कुल सही जहां आप लोगो को सबसे बाईं ओर और लिंक को सबसे दाईं ओर रखना चाहते हैं, लिंक के बीच समान दूरी के साथ।
-
justify-content: space-around;यह मान प्रत्येक आइटम के चारों ओर समान स्थान के साथ आइटम वितरित करता है। प्रत्येक आइटम को उसके बाएं और दाएं दोनों तरफ जगह के "बुलबुले" के रूप में सोचें। जब आसन्न आइटम के बुलबुले मिलते हैं, तो उनके बीच का स्थान कंटेनर के किनारों पर स्थान से दोगुना दिखाई देता है। विशेष रूप से, बाहरी किनारों पर स्थान आइटम के बीच के स्थान के आकार का आधा है।
उपयोग का मामला: कार्ड लेआउट या गैलरी के लिए उपयोगी है जहां आप चाहते हैं कि आइटम को कंटेनर के किनारों से कुछ सांस लेने की जगह मिले, लेकिन उनके खिलाफ फ्लश न हो।
-
justify-content: space-evenly;यह तीनों में सबसे सहज है। यह सुनिश्चित करता है कि किसी भी दो आइटम के बीच का स्थान पहले/अंतिम आइटम और कंटेनर किनारे के बीच के स्थान के समान ही हो। हर गैप एक जैसा है।
उपयोग का मामला: आदर्श जब आपको एक पूरी तरह से संतुलित, सममित लेआउट की आवश्यकता होती है। यह अक्सर वही होता है जो डिजाइनर स्पष्ट रूप से चाहते हैं जब वे "समान दूरी" के लिए पूछते हैं।
align-items और align-self के साथ क्रॉस अक्ष अलाइनमेंट जीतना
जबकि justify-content मुख्य अक्ष को संभालता है, align-items एक पंक्ति के भीतर क्रॉस अक्ष के साथ आइटम के डिफ़ॉल्ट अलाइनमेंट का प्रबंधन करता है।
align-items मानों को समझना
align-items: stretch;(डिफ़ॉल्ट): यही कारण है कि आपके फ्लेक्स आइटम अक्सर अपने कंटेनर की ऊंचाई को भरने के लिए कहते हुए नहीं दिखाई देते हैं। आइटम क्रॉस अक्ष के साथ कंटेनर के आकार को भरने के लिए खिंच जाएंगे (उदाहरण के लिए,flex-direction: rowकंटेनर में ऊंचाई)।align-items: flex-start;: आइटम को क्रॉस अक्ष की शुरुआत में पैक किया जाता है।align-items: flex-end;: आइटम को क्रॉस अक्ष के अंत में पैक किया जाता है।align-items: center;: आइटम को क्रॉस अक्ष के साथ केंद्रित किया जाता है।align-items: baseline;: यह एक शक्तिशाली और कम उपयोग किया जाने वाला मूल्य है। आइटम को इस तरह संरेखित किया गया है कि उनकी टेक्स्ट बेसलाइन पंक्तिबद्ध हो। यह अविश्वसनीय रूप से उपयोगी है जब आपके पास अलग-अलग फ़ॉन्ट आकार वाले आइटम होते हैं (उदाहरण के लिए, एक उपशीर्षक के बगल में एक मुख्य शीर्षक) और आप उन्हें केवल उनके बॉक्स सीमाओं से नहीं, बल्कि पाठ्य रूप से संरेखित करना चाहते हैं।
align-self के साथ ओवरराइड करना
क्या होगा यदि आप चाहते हैं कि कोई विशेष आइटम दूसरों से अलग व्यवहार करे? वहीं align-self आता है। एक व्यक्तिगत फ्लेक्स आइटम पर लागू, यह केवल उस आइटम के लिए कंटेनर की align-items प्रॉपर्टी को ओवरराइड करता है। यह align-items (प्लस `auto`, जो इसे कंटेनर के मान पर रीसेट करता है) के समान सभी मानों को स्वीकार करता है।
उदाहरण: कार्ड की एक पंक्ति की कल्पना करें, सभी align-items: center के साथ केंद्रित हैं। आप align-self: stretch; लागू करके एक "विशेष" कार्ड को अलग दिखा सकते हैं, जिससे यह दूसरों की तुलना में लंबा हो जाएगा।
अप्रकाशित हीरो: align-content के साथ उन्नत डिस्ट्रीब्यूशन
यह तर्कपूर्वक फ्लेक्सबॉक्स में सबसे गलत समझा जाने वाला प्रॉपर्टी है, और इसमें महारत हासिल करना उन्नत प्रवीणता का प्रतीक है। भ्रम का एक सामान्य बिंदु align-items के साथ इसकी समानता है।
यहां महत्वपूर्ण नियम है: align-content का कोई प्रभाव नहीं जब आपके फ्लेक्स आइटम सभी एक ही लाइन में हों। यह केवल तभी काम करता है जब आपके पास एक मल्टी-लाइन फ्लेक्स कंटेनर हो (अर्थात, आपने flex-wrap: wrap; सेट किया है और आइटम वास्तव में नई लाइनों पर लपेटे गए हैं)।
इसे इस तरह सोचें:
align-itemsआइटम को उनकी लाइन के भीतर संरेखित करता है।align-contentकंटेनर के भीतर लाइनों को ही संरेखित करता है। यह आइटम की पंक्तियों के बीच क्रॉस अक्ष में स्थान के वितरण को नियंत्रित करता है।
यह अनिवार्य रूप से justify-content की तरह काम करता है, लेकिन क्रॉस अक्ष के लिए। इसके मान लगभग समान हैं:
align-content: flex-start;(डिफ़ॉल्ट): सभी लाइनों को कंटेनर की शुरुआत में पैक किया जाता है।align-content: flex-end;: सभी लाइनों को अंत में पैक किया जाता है।align-content: center;: सभी लाइनों को केंद्र में पैक किया जाता है।align-content: space-between;: पहली लाइन शुरुआत में है, अंतिम लाइन अंत में है, और स्थान लाइनों के बीच समान रूप से वितरित है।align-content: space-around;: प्रत्येक लाइन के चारों ओर समान स्थान रखा गया है।align-content: space-evenly;: प्रत्येक लाइन के बीच की दूरी समान है।align-content: stretch;: लाइनें शेष स्थान को लेने के लिए खिंचती हैं।
उपयोग का मामला: एक फोटो गैलरी की कल्पना करें जहां आइटम लपेटते हैं। यदि कंटेनर की ऊंचाई निश्चित है, तो कुछ अतिरिक्त ऊर्ध्वाधर स्थान बचा हो सकता है। डिफ़ॉल्ट रूप से, यह स्थान नीचे दिखाई देता है। align-content: space-between; या align-content: center; का उपयोग करके, आप अपनी तस्वीरों के पूरे ग्रिड के ऊर्ध्वाधर वितरण को नियंत्रित कर सकते हैं, जिससे एक बहुत अधिक पेशेवर दिखने वाला लेआउट बन सकता है।
डायनेमिक साइजिंग और डिस्ट्रीब्यूशन: flex शॉर्टहैंड
स्थिर लेआउट दुर्लभ हैं। फ्लेक्सबॉक्स की वास्तविक शक्ति डायनेमिक कंटेंट और उपलब्ध स्थान को संभालने की क्षमता से आती है। इसे तीन प्रॉपर्टीज द्वारा नियंत्रित किया जाता है, जिन्हें अक्सर flex शॉर्टहैंड के माध्यम से सेट किया जाता है: flex-grow, flex-shrink और flex-basis।
1. flex-basis: शुरुआती बिंदु
किसी भी बढ़ने या सिकुड़ने से पहले, फ्लेक्सबॉक्स को प्रत्येक आइटम के लिए एक शुरुआती आकार की आवश्यकता होती है। यह flex-basis का काम है। यह मुख्य अक्ष के साथ एक तत्व के डिफ़ॉल्ट आकार को परिभाषित करता है।
- यदि किसी विशिष्ट लंबाई (उदाहरण के लिए,
200pxया10rem) पर सेट किया गया है, तो यह आइटम का प्रारंभिक आकार बन जाता है। - यदि
autoपर सेट किया गया है, तो यह आइटम पर `चौड़ाई` या `ऊंचाई` प्रॉपर्टी की तलाश करता है। यदि कोई मौजूद नहीं है, तो यह आइटम की सामग्री के आधार पर आकार देता है। - यदि
0पर सेट किया गया है, तो आइटम का कोई शुरुआती आकार नहीं है और इसका अंतिम आकार विशुद्ध रूप से इसके `flex-grow` अनुपात द्वारा निर्धारित किया जाता है।
सर्वोत्तम अभ्यास: फ्लेक्स संदर्भ में `चौड़ाई` के बजाय flex-basis का उपयोग करना अक्सर बेहतर होता है, क्योंकि यह मुख्य अक्ष के संदर्भ में आइटम के आकार को परिभाषित करने के बारे में अधिक स्पष्ट है।
2. flex-grow: सकारात्मक स्थान का उपभोग करना
जब फ्लेक्स कंटेनर में अपने मुख्य अक्ष के साथ अतिरिक्त स्थान होता है, तो flex-grow निर्धारित करता है कि उस स्थान को कैसे वितरित किया जाता है। यह एक इकाई रहित अनुपात है।
- डिफ़ॉल्ट मान
0है, जिसका अर्थ है कि आइटम अतिरिक्त स्थान को भरने के लिए नहीं बढ़ेंगे। - यदि सभी आइटम में
flex-grow: 1है, तो अतिरिक्त स्थान उनके बीच समान रूप से वितरित किया जाता है। - यदि एक आइटम में
flex-grow: 2है और दूसरे मेंflex-grow: 1है, तो पहले आइटम को दूसरे की तुलना में दोगुना अतिरिक्त स्थान मिलेगा।
3. flex-shrink: नकारात्मक स्थान (अतिप्रवाह) को संभालना
यह `फ्लेक्स-ग्रो` का प्रतिरूप है। जब कंटेनर में सभी आइटम को उनके `फ्लेक्स-आधार` पर फिट करने के लिए पर्याप्त स्थान नहीं होता है, तो उन्हें सिकुड़ने की आवश्यकता होती है। flex-shrink नियंत्रित करता है कि वे कितना सिकुड़ते हैं।
- डिफ़ॉल्ट मान
1है, जिसका अर्थ है कि अतिप्रवाह को रोकने के लिए सभी आइटम डिफ़ॉल्ट रूप से आनुपातिक रूप से सिकुड़ते हैं। - यदि आप किसी आइटम पर
flex-shrink: 0सेट करते हैं, तो वह सिकुड़ेगा नहीं। यह अपने `फ्लेक्स-आधार` आकार को बनाए रखेगा, जिससे संभावित रूप से कंटेनर अतिप्रवाहित हो जाएगा। यह लोगो या बटन जैसे तत्वों के लिए उपयोगी है जिन्हें कभी भी संपीड़ित नहीं किया जाना चाहिए।
flex शॉर्टहैंड: उन सभी को एक साथ रखना
flex प्रॉपर्टी flex-grow, flex-shrink और flex-basis के लिए एक शॉर्टहैंड है, इस क्रम में।
flex: 0 1 auto;(डिफ़ॉल्ट): आइटम बढ़ नहीं सकता है, सिकुड़ सकता है, और इसका आधार इसकी चौड़ाई/ऊंचाई या सामग्री द्वारा निर्धारित किया जाता है।flex: 1;(flex: 1 1 0;के लिए शॉर्टहैंड): एक बहुत ही सामान्य मूल्य। आइटम बढ़ और सिकुड़ सकता है, और इसका शुरुआती आकार 0 है। यह प्रभावी रूप से आइटम को विशुद्ध रूप से उनके फ्लेक्स-ग्रो अनुपात के आधार पर स्थान साझा करता है।flex: auto;(flex: 1 1 auto;के लिए शॉर्टहैंड): आइटम बढ़ और सिकुड़ सकता है, और इसका आधार इसकी सामग्री द्वारा निर्धारित किया जाता है। यह आइटम को उनकी सामग्री के आधार पर अलग-अलग आकार देने की अनुमति देता है, लेकिन फिर भी लचीले ढंग से अतिरिक्त स्थान को अवशोषित करता है।flex: none;(flex: 0 0 auto;के लिए शॉर्टहैंड): आइटम पूरी तरह से अनम्य है। यह बढ़ या सिकुड़ नहीं सकता है।
व्यावहारिक उपयोग के मामले और उन्नत परिदृश्य
परिदृश्य 1: स्टिकी फ़ूटर (होली ग्रेल लेआउट)
एक क्लासिक वेब डिज़ाइन समस्या: सामग्री के छोटा होने पर भी फ़ूटर को पृष्ठ के नीचे कैसे चिपकाया जाए, लेकिन सामग्री के लंबा होने पर स्वाभाविक रूप से नीचे धकेल दिया जाए।
.page-container {
display: flex;
flex-direction: column;
min-height: 100vh; /* व्यू पोर्ट ऊंचाई */
}
.main-content {
flex-grow: 1; /* या flex: 1; */
}
मुख्य पृष्ठ कंटेनर को कॉलम-आधारित फ्लेक्सबॉक्स बनाकर और मुख्य सामग्री क्षेत्र को flex-grow: 1 पर सेट करके, हम इसे सभी उपलब्ध ऊर्ध्वाधर स्थान का उपभोग करने के लिए कहते हैं, फ़ूटर को व्यू पोर्ट के नीचे तक धकेलते हैं।
परिदृश्य 2: समूहों को विभाजित करने के लिए ऑटो मार्जिन
आप सबसे बाईं ओर एक लोगो और सबसे दाईं ओर लिंक के एक समूह के साथ एक नेविगेशन बार कैसे बनाते हैं? जबकि justify-content: space-between काम करता है यदि लोगो एक एकल फ्लेक्स आइटम है, तो क्या होगा यदि आपके पास दाईं ओर कई आइटम हैं?
समाधान फ्लेक्सबॉक्स में ऑटो मार्जिन का जादू है।
.navbar {
display: flex;
}
.logo {
/* किसी विशेष प्रॉपर्टी की आवश्यकता नहीं है */
}
.nav-links {
margin-left: auto;
}
एक फ्लेक्स कंटेनर में, एक ऑटो मार्जिन उस दिशा में उपलब्ध सभी स्थान का लालची से उपभोग करेगा जिस दिशा में इसे लागू किया गया है। नेविगेशन लिंक के समूह पर margin-left: auto सेट करके, यह लोगो और लिंक के बीच एक लचीला, खाली स्थान बनाता है, लिंक को दाईं ओर धकेलता है।
परिदृश्य 3: मीडिया ऑब्जेक्ट
एक सामान्य UI पैटर्न में एक तरफ एक छवि या आइकन और दूसरी तरफ वर्णनात्मक टेक्स्ट होता है। टेक्स्ट को सभी शेष स्थान लेना चाहिए और अच्छी तरह से लपेटना चाहिए।
.media-object {
display: flex;
align-items: flex-start; /* छवि और टेक्स्ट को शीर्ष पर संरेखित करता है */
}
.media-image {
margin-right: 1rem;
flex-shrink: 0; /* छवि को कुचलने से रोकता है */
}
.media-body {
flex-grow: 1; /* सभी शेष क्षैतिज स्थान लेता है */
}
यहां, टेक्स्ट कंटेनर पर flex-grow: 1 महत्वपूर्ण है। यह सुनिश्चित करता है कि छवि कितनी भी चौड़ी क्यों न हो, टेक्स्ट बॉडी कंटेनर में शेष उपलब्ध चौड़ाई को भरने के लिए विस्तारित होगी।
निष्कर्ष: संरेखण से परे, जानबूझकर लेआउट की ओर
फ्लेक्सबॉक्स में महारत हासिल करने का अर्थ है केवल चीजों को केंद्र में रखने से आगे बढ़ना। यह अक्षों के बीच तालमेल, स्थान वितरण का तर्क और आइटम साइजिंग के लचीलेपन को समझने के बारे में है। मल्टी-लाइन लेआउट के लिए align-content, डायनेमिक साइजिंग के लिए flex शॉर्टहैंड और ऑटो मार्जिन जैसे शक्तिशाली पैटर्न की ठोस समझ प्राप्त करके, आप ऐसे लेआउट बना सकते हैं जो न केवल देखने में आकर्षक हैं, बल्कि मजबूत, रिस्पॉन्सिव और सिमेंटिक रूप से साफ भी हैं।
अगली बार जब आप किसी जटिल लेआउट चुनौती का सामना करें, तो फ़्लोट्स या जटिल पोजिशनिंग हैक्स तक पहुंचने की इच्छा का विरोध करें। इसके बजाय, अपने आप से पूछें: क्या इसे स्थान के जानबूझकर वितरण से हल किया जा सकता है? उत्तर, अक्सर, CSS फ्लेक्सबॉक्स की उन्नत क्षमताओं के भीतर पाया जाएगा।